package lispinterpreter;

import java.util.StringTokenizer;

public class Parser {

    /**
     * Mensaje de error para la apertura y cierre de paréntesis en la
     * instrucción lisp.
     */
    private static final String ERROR_APERTURA_PARENTESIS = "Error! En la apertura y cierre de paréntesis.";

    /**
     * Mensaje de error para indicar que la cantidad de ( no es igual a la de ).
     */
    private static final String ERROR_NUMERO_PARENTESIS = "Error! En el # de ( y/o ).";

    /**
     * Delimitadores de texto para instrucciones lisp.
     */
    private static final String LISP_DELIMITERS = " ";

    /**
     * Lista con los elementos de lisp
     */
    private LispList lispList;

    /**
     * Crea una nueva lista lispList para almacenar los elementos de la
     * instrucción
     */
    public Parser(LispList l) {
	lispList = l;
    }

    /**
     * Genera la lista de tokes a paritr de los delimitadores de texto de lisp
     * 
     * @param ins String con la instrucción lisp a valuar.
     * @return
     */
//    public void parser(String ins) {
//
//	System.out.print(">> " + ins + "\t\n   ");
//	if (sintaxisCorrecta(ins)) {
//
//	    StringTokenizer parser = new StringTokenizer(ins, LISP_DELIMITERS);
//	    String token = null;
//
//	    while (parser.hasMoreTokens()) {
//		token = parser.nextToken();
//		lispList.addElement(token);
//	    }
//	    lispList.showElementsAsVector(true);
//	}
//
//	// TODO Agregar a la estructura de datos los token luego que se
//	// verifique si está bien la generación de los mismos.
//    }
    
    public void parser(String cadena) {
	int len = cadena.length();
	String sbcadena = null;
	LispList list = new LispList();
	
	System.out.println(cadena);
	for (int i = 0; i < len; i++) {
	    System.out.println("[" + i + "]" + " " + cadena.charAt(i));
	}
	
    }

    /**
     * Verifica la sintáxis de la instrucción a partir de la cantidad de ( y ).
     * 
     * @param ins String con la instrucción lisp
     * @return true sí y sólo si la instrucción contiene la misma cantidad de (
     *         que ). No se indica la ubicación de error.
     * @author setian
     */

    private boolean sintaxisCorrecta(String ins) {
	int numAbiertos = 0;
	int numCerrados = 0;
	char c = 0;

	// TODO veriricar si es necesario incluir otros métodos de validación a
	// partir de ( y ).
	if (ins.startsWith("(") && ins.endsWith(")")) {
	    for (int i = 0; i < ins.length(); i++) {
		c = ins.charAt(i);
		if (c == '(')
		    numAbiertos++;
		else if (c == ')')
		    numCerrados++;
	    }
	} else {
	    System.out.println(ERROR_APERTURA_PARENTESIS);
	    return false;
	}

	// Verifica si hay tantos ( como ).
	if (numAbiertos != numCerrados) {
	    System.out.println(ERROR_NUMERO_PARENTESIS);
	    return false;
	} else
	    return true;
    }
}
